
#include <stdlib.h>
#include <stdio.h>
#include "database.h"
#include "../model/filme.h"
#include <string.h>



/*
 * Funcoes auxiliares que adicionam no arquivo, consultando 
 * lugares vagos no meio do arquivo
 */
void add_no_garb(FILE *file, tFilme filme) {
    fseek(file, 0, SEEK_END);
    fwrite(&filme, sizeof (tFilme), 1, file);
}

void add_garb(FILE *f, tFilme filme, int garb) {
    tFilme filmeLido;
    int boff = 2 + (garb - 1) * sizeof (tFilme);
    fseek(f, boff, SEEK_SET);
    fread(&filmeLido, sizeof (tFilme), 1, f);
    fseek(f, boff, SEEK_SET);
    fwrite(&filme, sizeof (tFilme), 1, f);
    fseek(f, 0, SEEK_SET);
    fwrite(&filmeLido.ano, sizeof (short), 1, f);
}

/*
 * funcao que insere um novo registro no arquivo
 */
int inserirDatabase(char *nomeArquivo, tFilme filme) {
    short garb;
    FILE *file = fopen(nomeArquivo, "r+b");
    fseek(file, 0, SEEK_SET);
    fread(&garb, sizeof (short), 1, file);

    if (garb == 0) {
        add_no_garb(file, filme);
        fclose(file);
        return 1;
    }
    add_garb(file, filme, garb);
    fclose(file);
    return 1;
}

/*
 * funcao abre o arquivo de dados, 
 * caso não exista ele cria um novo arquivo
 */
void initDatabase(char *nomeArquivo) {
    FILE *file = fopen(nomeArquivo, "r+b");
    short cabecalho = 0;
    if (!file) {
        file = fopen(nomeArquivo, "w+b");
    }
    if (!feof(file)) {
        fwrite(&cabecalho, sizeof (short), 1, file);
    }
    fclose(file);
}

/*
 * Funcao que imprime o registro retornado, verificando se a busca foi por ano e conferindo a mesma
 */
int print_filter(tFilme filme, char *value, char *value2, int ano, int ano2) {
    if (!ano) { 
        if (!strcasecmp(value, value2)) {
            printf("%s\n", filmeToChar(filme));
        }
    } else {
        if (ano == ano2) {
            printf("%s\n", filmeToChar(filme));
        }
    }
    return 1;
}

/*
 * funcao que consulta um registro no arquivo
 */
void consultaDatabase(char *nomeArquivo, char *atributo, char *valor, int ano) {
    tFilme filmeLido;
    FILE *f = fopen(nomeArquivo, "r+b");
    fseek(f, 2, SEEK_SET);
    while (fread(&filmeLido, sizeof (tFilme), 1, f) > 0) {
        if (!strcmp(filmeLido.titulo, "$")) continue;
        if (!strcmp(atributo, "titulo")) if (print_filter(filmeLido, filmeLido.titulo, valor, 0, 0)) continue;
        if (!strcmp(atributo, "ator")) if (print_filter(filmeLido, filmeLido.ator, valor, 0, 0)) continue;
        if (!strcmp(atributo, "genero")) if (print_filter(filmeLido, filmeLido.genero, valor, 0, 0)) continue;
        if (!strcmp(atributo, "ano")) if (print_filter(filmeLido, NULL, NULL, ano, filmeLido.ano)) continue;
    }
    printf("\n\n");
}

